package com.xrit.sunnyday.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.xrit.sunnyday.dao.OrderSettingDao;
import com.xrit.sunnyday.exception.SunnydayException;
import com.xrit.sunnyday.pojo.OrderSetting;
import com.xrit.sunnyday.service.OrderSettingService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author Daoying
 * creationTime: 2022/11/10 18:22
 */
@Service(interfaceClass = OrderSettingService.class)
public class OrderSettingServiceImpl implements OrderSettingService {

    @Autowired
    private OrderSettingDao orderSettingDao;

    @Override
    public void add(List<OrderSetting> orderSettingList) throws SunnydayException {
        //1.遍历，挨个取出每一行(OrderSetting)
        for (OrderSetting orderSetting : orderSettingList) {
            //2. 取出日期
            Date orderDate = orderSetting.getOrderDate();
            /**
             * 3.拿日期查询数据表里边是否存在重复，如果重复代表医生现在要进行更新
             * 逻辑：
             * 存在
             * 判断数据库表中已预约人数是否大于 要更新的 可预约人数
             *  大于 则报错
             *  小于 则更新可预约数
             * 不存在
             *  则插入预约设置
             */

            //查询预约设置
            OrderSetting date = orderSettingDao.findByOrderDate(orderDate);
            //判断对应的日期是否存在(excel中一行对应一个OrderSetting实体)
            if (null != date) {//存在
                //判断数据库表中已预约人数是否大于 要更新的 可预约人数,反之抛异常
                if (date.getReservations() > orderSetting.getNumber()) {
                    //大于 则报错
                    throw new SunnydayException(orderSetting.getOrderDate() + "中，已预约的人数比你现在设置的可预约人数要大");
                }
            } else {//不存在
                orderSettingDao.add(orderSetting);
            }

        }
    }

    /*
     * 根据日期查询预约设置数据(获取指定日期所在月份的预约设置数据)
     * */
    @Override
    public List<Map<String, Integer>> getOrderSettingByMonth(String month) {
        // 1.拼接开始日期
        String startDate = month + "-01";

        //2.换一种方式，只传开始日期，使用Mysql的函数“SELECT LAST_DAY('yyyy-MM-dd')”,会找出对应MM月的最后一天
        return orderSettingDao.getOrderSettingByMonth(startDate);
    }

    /*
     * 通过日期设置预约信息
     * */
    @Override
    public void editNumberByDate(OrderSetting orderSetting) throws SunnydayException {
        //获取前端传递过来的日期
        Date orderDate = orderSetting.getOrderDate();

        //通过日期判断预约设置是否存在？
        OrderSetting osInDb = orderSettingDao.findByOrderDate(orderDate);

        //存在
        if (null != osInDb) {
            // 判断已经预约的人数是否大于要更新的最大可预约人数， reverations > 传进来的number数量，则不能更新，要报错
            if (osInDb.getReservations() > orderSetting.getNumber()) {
                // 已经预约的人数高于最大预约人数，不允许
                throw new SunnydayException("最大预约人数不能小已预约人数！");
            }
            // reverations <= 传进来的number数量，则要更新最大可预约数量
            orderSettingDao.editNumberByOrderDate(orderSetting);
        } else {
            //不存在就添加
            orderSettingDao.add(orderSetting);
        }


    }
}
